import myAxios from "../plugins/myAxios.ts";
import {setCurrentUserState} from "../states/user.ts";
import { UserType } from "../models/user";

// 定义API响应类型
interface ApiResponse<T> {
    code: number;
    data: T;
    message?: string;
    description?: string;
}

// 创建错误响应
const createErrorResponse = (code: number, message: string, description: string): ApiResponse<null> => {
    return {
        code,
        data: null,
        message,
        description
    };
};

/**
 * 从本地存储获取用户信息
 */
const getUserFromLocalStorage = (): ApiResponse<UserType> | null => {
    const currentUser = localStorage.getItem('user');
    if (!currentUser) {
        return null;
    }
    
    try {
        const userData = JSON.parse(currentUser);
        if (userData && userData.id) {
            console.log('本地用户信息有效:', userData.username);
            return {
                code: 0,
                data: userData,
                message: "本地缓存用户",
                description: "从本地缓存加载的用户信息"
            };
        }
    } catch (e) {
        console.error('解析本地存储用户数据失败', e);
    }
    
    return null;
};

/**
 * 从服务器获取用户信息
 */
const getUserFromServer = async (): Promise<ApiResponse<UserType | null>> => {
    // 添加时间戳参数避免缓存
    const timestamp = new Date().getTime();
    const res = await myAxios.get(`/user/current?t=${timestamp}`);
    console.log('服务器响应:', res);
    
    if (res?.code === 0 && res?.data) {
        console.log('从服务器获取用户成功:', res.data.username);
        setCurrentUserState(res.data);
        localStorage.setItem('user', JSON.stringify(res.data));
        sessionStorage.setItem('user', JSON.stringify(res.data));
        return res as ApiResponse<UserType>;
    }
    
    return createErrorResponse(
        res?.code || 40100,
        res?.message || "未登录或登录已过期",
        res?.description || "请重新登录"
    );
};

/**
 * 获取当前登录用户
 * @param forceRefresh 是否强制从服务器刷新，默认为false
 */
export const getCurrentUser = async (forceRefresh: boolean = false): Promise<ApiResponse<UserType | null>> => {
    console.log('开始获取当前用户信息', forceRefresh ? '(强制刷新)' : '');
    
    // 如果不是强制刷新，先从本地存储中获取
    if (!forceRefresh) {
        const localUser = getUserFromLocalStorage();
        if (localUser) {
            return localUser;
        }
    }
    
    // 如果是强制刷新或本地没有或无效，则从服务器获取
    try {
        // 添加时间戳参数避免缓存
        return await getUserFromServer();
    } catch (error: any) {
        console.error('获取用户信息过程中发生错误:', error);
        
        // 如果强制刷新失败且不是强制刷新模式，再次尝试本地存储作为备用
        if (!forceRefresh) {
            const fallbackUser = getUserFromLocalStorage();
            if (fallbackUser) {
                return fallbackUser;
            }
        }
        
        return createErrorResponse(
            50000,
            "获取用户信息失败",
            error.message || "发生未知错误"
        );
    }
};

/**
 * 更新本地用户状态
 */
export const updateCurrentUser = (user: UserType): void => {
    // 确保用户对象是有效的
    if (!user || !user.id) {
        console.error('尝试更新无效的用户信息', user);
        return;
    }
    
    console.log('更新用户信息:', user.username);
    
    // 更新全局状态
    setCurrentUserState(user);
    
    // 更新localStorage
    localStorage.setItem('user', JSON.stringify(user));
    
    // 同时更新sessionStorage，确保会话期间数据一致
    sessionStorage.setItem('user', JSON.stringify(user));
    
    // 如果有其他缓存机制也需要更新
    // 例如，如果使用cookies存储用户ID等简单信息
    document.cookie = `userId=${user.id}; path=/; max-age=86400`;
    
    // 触发自定义事件，通知其他组件用户信息已更新
    const event = new CustomEvent('userUpdated', { detail: user });
    window.dispatchEvent(event);
    
    console.log('用户信息已更新到所有存储位置');
};

/**
 * 清除用户状态
 */
export const clearCurrentUser = (): void => {
    localStorage.removeItem('user');
    setCurrentUserState(null);
};